#include <bits/stdc++.h>

using namespace std;

// 无根树的直径
// 树的相关介绍：https://oi-wiki.org/graph/tree-basic/
// 帖子：https://www.cnblogs.com/dx123/p/17302097.html
// 帖子：https://oi-wiki.org/graph/tree-diameter/
// 测试链接：https://www.nowcoder.com/questionTerminal/a77b4f3d84bf4a7891519ffee9376df3

// 不需要提交这个类
struct Interval 
{
    int start;
    int end;
    Interval(int s, int e) : start(start), end(e) {}
};

class Solution
{
public:
    static const int MAXN = 100001;
    static const int MAXM = MAXN << 1;
    // 链式前向星
    int head[MAXN];
    int to[MAXM];
    int next[MAXM];
    int weight[MAXM];
    int cnt = 1;
    int ans = 0;
    bool visited[MAXN];

    // 链式前向星加边
    void addEdge(int u, int v, int w)
    {
        next[cnt] = head[u];
        to[cnt] = v;
        weight[cnt] = w;
        head[u] = cnt++;
    }

    int dfs(int u)
    {
        visited[u] = true; // 标记 u 这个点被搜过
        int d1 = 0; // 记录从 u 这个点往下走的最大长度
        int d2 = 0; // 记录从 u 这个点往下走的次大长度
        for(int ei = head[u]; ei; ei = next[ei])
        {
            int v = to[ei];
            if(visited[v]) continue; // 避免向上查找
            int d = dfs(v) + weight[ei]; // 从 u 经过 v 点往下走的最大长度
            if(d >= d1) d2 = d1, d1 = d; // 更新 d1 和 d2
            else if(d > d2) d2 = d;
        }
        ans = max(ans, d1 + d2); // 更新答案
        return d1; // 返回从点 u 往下走的最大长度
    }

    /**
     * 代码中的类名、方法名、参数名已经指定，请勿修改，直接返回方法规定的值即可
     *
     * 树的直径
     * @param n int整型 树的节点个数
     * @param Tree_edge Interval类vector 树的边
     * @param Edge_value int整型vector 边的权值
     * @return int整型
     */
    int solve(int n, vector<Interval>& Tree_edge, vector<int>& Edge_value) 
    {
        for(int i = 0; i < n - 1; ++i)
        {
            // 链式前向星建图
            int u = Tree_edge[i].start, v = Tree_edge[i].end;
            int w = Edge_value[i];
            addEdge(u, v, w);
            addEdge(v, u, w);
        }
        dfs(0);
        return ans;
    }
};